<?php
/**
 * @file			weibo.class.php
 * @CopyRight		(C)1996-2099 SINA Inc.
 * @Project			Xweibo
 * @Author			heli <heli1@staff.sina.com.cn>
 * @Create Date:	2010-07-08
 * @Modified By:	heli/2010-11-15
 * @Brief			微博api操作类
 */
require_once 'config.inc.php';
include_once dirname(__file__). '/../oauth.class.php';

class sinaWeibo_class 
{
	var $http;
	var $token;
	var $shal_method;
	var $consumer;
	var $storage;
	var $format = 'json';
	var $logType = 'api';
	/**
	 * 构造函数
	 *
	 * @param $oauth_token
	 * @param $oauth_token_secret
	 * @return
	 */
	
	function __construct($app_key = NULL, $secret_key = NULL) {
		if(!$app_key) {
			$app_key = sinaApiConfig::$APIKey;
			$secret_key=sinaApiConfig::$SecretKey;
		}
        $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
        $this->consumer = new OAuthConsumer($app_key, $secret_key);	
		$this->http = vApi::getHttp();
	}
	
	/**
	 * 手动设置access_token
	 *
	 * @param $oauth_token
	 * @param $oauth_token_secret
	 * @return unknown
	 */
	function setToken($oauth_token, $oauth_token_secret) {
		$this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
	}
	
	// 设置默认的token
	function setDefToken() {
		$this->setToken(sinaApiConfig::$appToken, sinaApiConfig::$appTkSecret);
		return $this;
	}

	//oauth
	
	/**
	 * 第一步：获取request token
	 *
	 * @param string $oauth_callback
	 * @return array a key/value array containing oauth_token and oauth_token_secret
	 */
	
	function getRequestToken($oauth_callback) {
		$parameters = array();
		$parameters['oauth_callback'] = $oauth_callback;
		$request = $this->oAuthRequest(sinaApiConfig::$url . 'oauth/request_token', 'GET', $parameters, FALSE, TRUE);
		$token = OAuthUtil::parse_parameters($request);
		
		$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
		return $token;
	}
	
	/**
	 * 第二步：获取url
	 *
	 * @param array|string $token
	 * @param string $url
	 * @return string
	 */
	
	function getAuthorizeURL($token,$oauth_callback, $display='page') {
		if (is_array($token)) {
			$token = $token['oauth_token'];
		}

		return sinaApiConfig::$url . 'oauth/authorize?oauth_token='.$token.'&oauth_callback='.urlencode($oauth_callback)."&display=$display";
	}
	
	/**
	 * 第三步：获取access_token
	 * Exchange the request token and secret for an access token and
	 * secret, to sign API calls.
	 *
	 * @param string $oauth_verifier
	 * @param array $oauth_token
	 * @return array array("oauth_token" => the access token,
	 *                "oauth_token_secret" => the access secret)
	 */
	
	function getAccessToken($oauth_token, $oauth_verifier) {
		$parameters = array();
		if (!empty($oauth_verifier)) {
			$parameters['oauth_verifier'] = $oauth_verifier;
		}

		$this->token = new OAuthConsumer($oauth_token['oauth_token'], $oauth_token['oauth_token_secret']);
		$request = $this->oAuthRequest(sinaApiConfig::$url . 'oauth/access_token', 'GET', $parameters, FALSE, TRUE);
		if (!$request || (is_array($request) && !empty($request['errno']))) {
			return $request;
		}
		$token = OAuthUtil::parse_parameters($request);
		$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
		return $token;
	}
	
	function throwException($result){
		$error = json_decode($result, true);
		$error_array = explode(':', $error['error']);
		switch ($error_array[0]) {
			case '40107':
				$msg = array(
					'error_code' => '1510001',
					'error' => $error['error']
				);
			break;				
			default:
				$msg = array(
					'error_code' => '1510000',
					'error' => 'unknow system error  api: ' . $error['error']
				);					
		}
		return $msg;
	}	
	
	/**
	 * Format and sign an OAuth / API request
	 *
	 * @param string $url
	 * @param string $method
	 * @param array $parameters
	 * @param bool $multi
	 * @return array
	 */
	
	function oAuthRequest($url, $method, $parameters, $multi = FALSE, $userType = FALSE) {
        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
        $request->sign_request($this->sha1_method, $this->consumer, $this->token);
		$method = strtoupper($method);
        switch ($method) {
	        case 'GET':
				$this->http->base_string = $request->base_string;
				$this->http->key_string = $request->key_string;
				$this->http->setUrl($request->to_url());
				$result = $this->http->request();
				break;

			case 'DELETE':
				$this->http->base_string = $request->base_string;
				$this->http->key_string = $request->key_string;
				$this->http->setUrl($request->get_normalized_http_url());
				$this->http->setData($request->to_postdata($multi));
				$result = $this->http->request('delete');
				break;
	        default:
				$this->http->base_string = $request->base_string;
				$this->http->key_string = $request->key_string;
				$this->http->setUrl($request->get_normalized_http_url());
				$this->http->setData($request->to_postdata($multi));
				if ($multi) {
					$header_array2 = array("Content-Type: multipart/form-data; boundary=" . $GLOBALS['___xwbStData']['boundary'] , "Expect: ");
					$config = array('http_header' => $header_array2);
					$this->http->setConfig($config);
				}
				$method = 'POST';
				$result = $this->http->request('post');
        }
		
        //　发完了API请求
        $code = $this->http->getState();
		if (200 != $code) {
			//日志处理
			if (0 == $code) {
				$msg = array(
					'error_code' => '1040002',
					'error' => '系统繁忙，请稍后再试'
				);
				return $msg;
			}

			$db = vApi::DB();
			$logParam = array('url'=>$url, 'post_data'=>json_encode($parameters), 'http_code'=>$code, 'result'=>$result, 'curl_error'=>$this->http->getError(), 'service_id'=>1, 's_ip'=>$_SERVER['SERVER_ADDR'], 'app_source'=>vApi::source(), 'uid'=>vApi::uid(), 'log_time'=>date('Y-m-d H:i:s'));
			$db->save($logParam, null, API_TB_3RD_API_LOG);
			unset($db);			
			return $this->throwException($result);
		}
 		
		if ($userType === true) {
			return $result;
		}

		$result = json_decode(preg_replace('#(?<=[,\{\[])\s*("\w+"):(\d{6,})(?=\s*[,\]\}])#si', '${1}:"${2}"', $result), true);
		return $result;
	}

	
	/**
	 * 发布一条微博信息
	 *
	 * @param string $status 微博内容
	 * @return array
	 */
	
	function update($p) {
		$params = array();		
		$url = sinaApiConfig::$url . 'statuses/update.' . $this->format;
		$params['status'] = $p['status'];
		$response = $this->oAuthRequest($url, 'post', $params);

		return $response;
	}
	/**
	 * 上传图片并发布一条微博信息
	 *
	 * @param string $status 微博内容
	 * @param string $pic 图片路径
	 * @return array
	 */
	
	function upload($p) {
		$params = array();
		$url = sinaApiConfig::$url . 'statuses/upload.' . $this->format;
		$params['status'] = isset($p['status'])?$p['status']:'';
		$params['pic'] = '@' . $p['pic'];
		
		$response = $this->oAuthRequest($url, 'post', $params, TRUE);		
		return $response;
	}
	
	
	/**
	 * 对一条微博信息进行评论
	 *
	 * @param int|string $id 微博id
	 * @param string $comment 评论内容
	 * @return array
	 */
	
	function comment($p) {
		$url = sinaApiConfig::$url . 'statuses/comment.' . $this->format;
		$params = array();
		$params['id'] = $p['id'];
		$params['comment'] = urlencode($p['comment']);		
		$response = $this->oAuthRequest($url, 'post', $params);
		return $response;
	}
	
	function getUserInfo() {
		$params = array();
		$url = sinaApiConfig::$url . 'account/verify_credentials.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
	
		return $response;
	}
	
	/*
	 * 获取指定地点周边的微博列表
	 * @param array $p
			source 	true 	string 	申请应用时分配的AppKey，调用接口时候代表应用的唯一身份。（采用OAuth授权方式不需要此参数） 
			longitude 	true 	float 	经度。有效范围：-180.0到+180.0，+表示东经。 
			latitude 	true 	float 	纬度。有效范围：-90.0到+90.0，+表示北纬。 
			range 	false 	int 	搜索范围，单位米，默认500米，最大11132米 
			time 	false 	int 	返回结果所在的时间段。单位为分钟；指从现在开始之前的时间段 
			sort_type 	false 	int 	排序方式。默认为0，按时间排序；为1时按与中心点距离进行排序 
			page 	false 	int 	返回结果页码。默认为1. 
			count 	false 	int 	每页结果数。默认10.最大50 
			base_app 	false 	int 	是否根据当前应用返回接口。默认0：全部应用；1：仅限当前应用
	 */
	function searchGeoStatuses($p) {
		$params = $p;
		$url = sinaApiConfig::$url . 'search/geo/statuses.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);		
		return $response;		
	}
	
	/**
	  *  获取指定地点周边的用户列表 
	 * @param array $p
			source 	true 	string 	申请应用时分配的AppKey，调用接口时候代表应用的唯一身份。（采用OAuth授权方式不需要此参数） 
			longitude 	true 	float 	经度。有效范围：-180.0到+180.0，+表示东经。 
			latitude 	true 	float 	纬度。有效范围：-90.0到+90.0，+表示北纬。 
			range 	false 	int 	搜索范围，单位米，默认500米，最大11132米 
			time 	false 	int 	返回结果所在的时间段。单位为分钟；指从现在开始之前的时间段 
			sort_type 	false 	int 	排序方式。默认为0，按时间排序；为1时按与中心点距离进行排序 
			page 	false 	int 	返回结果页码。默认为1. 
			count 	false 	int 	每页结果数。默认10.最大50 
			base_app 	false 	int 	是否根据当前应用返回接口。默认0：全部应用；1：仅限当前应用
	 */
	function searchGeoUsers($p){
		$params = $p;
		$url = sinaApiConfig::$url . 'search/geo/users.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);		
		return $response;
	}
	
	
	/**
	 * 搜索微博文章
	 *
	 * @param array $p 
			source 	true 	string 	申请应用时分配的AppKey，调用接口时候代表应用的唯一身份。（采用OAuth授权方式不需要此参数） 
			q 	false 	string 	搜索的关键字。必须进行[http://en.wikipedia.org/wiki/URL_encoding 
			filter_ori 	false 	int 	过滤器，是否为原创，0为全部，5为原创，4为转发。默认为0。 
			filter_pic 	false 	int 	过滤器。是否包含图片。0为全部，1为包含，2为不包含。 
			fuid 	false 	int64 	微博作者的用户ID。 
			province 	false 	int 	省份ID，参考省份城市编码表 
			city 	false 	int 	城市ID，参考省份城市编码表 
			starttime 	false 	number 	开始时间，Unix时间戳 
			endtime 	false 	number 	结束时间，Unix时间戳 
			page 	false 	int 	页码 
			count 	false 	int 	每页返回的微博数。（默认返回10条，最大200条。） 
			needcount 	false 	boolean 	返回结果中是否包含返回记录数。true则返回搜索结果记录数。 
			base_app 	false 	int 	是否按照当前应用信息对搜索结果进行过滤。当值为1时，仅返回通过该应用发送的微博消息。 
			callback 	false 	string 	仅JSON方式支持，用于JSONP跨域数据访问。
	 * @return array
	 */
	function statusesSearch($p)
	{
		$params = $p;
		$url = sinaApiConfig::$url . 'statuses/search.'.$this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 根据ID获取单条微博消息，以及该微博消息的作者信息。
	 *
	 * @param int id  要获取的微博消息ID，该参数为REST风格的参数,
	 * @return array
	 */
	function statusesShow($id)
	{
		$params = array();
		$url = sinaApiConfig::$url . 'statuses/show/'.$id.'.'.$this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 获取用户发布的微博信息列表
	 *
	 * @param int|string $id 用户id
	 * @param int|string $since_id 返回比since_id的的微博数据
	 * @parma int|string $max_id 返回不大于max_id的微博数据
	 * @param int $count 获取条数
	 * @param int $page 页码数
	 * @param int $feature 微博类型，0全部，1原创，2图片，3视频，4音乐
	 * @return array
	 */
	function getUserTimeline($id, $since_id=NULL, $max_id=NULL, $count=NULL, $page=NULL, $feature=0) 
	{
		$url = sinaApiConfig::$url . 'statuses/user_timeline.' . $this->format;
		
		$params 			= array();
		$params['base_app'] = 0;
		$params['feature']  = $feature;
		if(!is_numeric($id)){
			$params['screen_name'] = $id;
		}
		else{
			$params['user_id'] = $id;
		}
		if ($since_id) {
			$params['since_id'] = $since_id;
		}
		if ($max_id) {
			$params['max_id'] = $max_id;
		}
		if ($count) {
			$params['count'] = $count;
		}
		if ($page) {
			$params['page'] = $page;
		}
		
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	
	/**
	 *  获取相册列表，默认是当前用户
	 */
	function getAlbumList($uid, $page=1, $count=20) 
	{
		$url = sinaApiConfig::$IApiUrl . '2/photos/album.' . $this->format;
		
		$params 		 = array();
		$params['uid'] 	 = $uid;
		$params['page']  = max($page, 1);
		$params['count'] = min($count, 20) ;
		
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	
	/**
	 *  获取某相册的照片列表
	 */
	function getPhotoListFromAlbum($album_id, $page=1, $count=50) 
	{
		$url = sinaApiConfig::$IApiUrl . '2/photos/album/photo.' . $this->format;
		
		$params 			= array();
		$params['album_id'] = $album_id;
		$params['page'] 	= max($page, 1);
		$params['count'] 	= min($count, 50);
		
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 *  批量获取照片,一次最多20
	 */
	function getPhotoByIds($picids) 
	{
		$url = sinaApiConfig::$IApiUrl . '2/photos/photo/show_batch.' . $this->format;
		
		$params 				 = array();
		$params['picids'] 		 = $picids;
		$params['skip_question'] = 1;
		
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	
	/**
	 * 获取双向关注列表
	 * @param string uid 用户uid
	 * @param int count 返回结果条数数量，默认50 
	 * @param int page 返回结果的页码  
	 * @param int 0:按照关注时间排序；默认0.（目前暂时只支持按照关注时间排序）  
	 * @return array
	 */
	function getFriendsBilateral( $params=array() ) 
	{
		$url = sinaApiConfig::$IApiUrl . '2/friendships/friends/bilateral.' . $this->format;

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 获取关注列表
	 * @param string uid 用户uid
	 * @param int count 返回结果条数数量，默认50 
	 * @param int page 返回结果的页码  
	 * @param int 0:按照关注时间排序；默认0.（目前暂时只支持按照关注时间排序）  
	 * @return array
	 */
	function getFriends( $params=array() ) 
	{
		$url = sinaApiConfig::$url . 'statuses/friends.' . $this->format;

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 按用户ID或昵称返回用户资料以及用户的最新发布的一条微博消息
	 * @param string screen_name
	 *
	 * @return array
	 */
	function getUserShow($screen_name=NULL,$user_id=NULL) 
	{
		$params = array();
		$screen_name && ($params['screen_name'] = $screen_name);
		$user_id && ($params['user_id'] = $user_id);
		$url = sinaApiConfig::$url . 'users/show.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 批量获取用户信息
	 * @param string uids 用户uids, 最多20
	 * @return array
	 */
	function batchGetUser( $params=array() ) 
	{
		$url = sinaApiConfig::$url . 'users/batch_show.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}

	
	/**
	 * 返回用户关注的一组用户的ID列表
	 * @param int|string uid 用户uid
	 * @param string screen_name 用户昵称
	 * @param string cursor 分页位置
	 * @param int count 获取条数 最大不能超过5000，默认为500
	 *
	 * @return array
	 */
	function getFriendsIds($params = array()) 
	{
		$url = sinaApiConfig::$url . 'friends/ids.' . $this->format;

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	
	/**
	 * 像新浪微博发送通知
	 * uids	 	 string	接收通知的用户uid，支持1-100个用户，用逗号分隔.
	 * title 	 string	通知标题，必填，<30个汉字.必须做URLEncode，采用UTF-8编码。
	 * content	 string	通知内容，必填，<300个汉字.必须做URLEncode，采用UTF-8编码。
	 * notice_id string	通知ID，必填，该参数与title、content参数互斥并优先，当传了notice_id参数，将忽略title、content参数，notice_id参数必须是该应用发出过的。
	 */
	function sendNotice($params)
	{
		$this->setToken(sinaApiConfig::$appToken, sinaApiConfig::$appTkSecret);
		$url 	  = sinaApiConfig::$url . 'notice/app/send.' . $this->format;
		$response = $this->oAuthRequest($url, 'post', $params);
		return $response;
	}
	/**
	  *  私信 发送接口
	  */
	function sendMessage($uid,$text){
		$params['id']=$uid;
		$params['text']=$text;
		$this->setToken(sinaApiConfig::$appToken, sinaApiConfig::$appTkSecret);
		$url 	  = sinaApiConfig::$url . 'direct_messages/new.' . $this->format;
		$response = $this->oAuthRequest($url, 'post', $params);
		return $response;
	}
	
	/**
	 * 获取用户粉丝对象uid列表
	 *
	 * @param int|string $id 用户id
	 * @param int|string $user_id 用户user id
	 * @param string $name 用户昵称
	 * @param string $cursor 分页的位置 单页最多返回5000条记录。通过增加或减少cursor值来获取更多的粉丝列表。如果提供该参数，返回结果中将给出下一页的起始游标。
	 * @param int $count 获取条数 默认500，最大5000
	 * @return array
	 */
	 function getFollowerIds($params)
	 {
		if (isset($params['id']) && $params['id']) {
			$url = sinaApiConfig::$url . 'followers/ids/' . $params['id'].'.'.$this->format;
			unset($params['id']);
		} else {
			$url = sinaApiConfig::$url . 'followers/ids.' . $this->format;
		}
		
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	 }

	/**
	 * 获取当前用户粉丝列表及最新一条微博信息
	 *
	 * @param int|string $id 用户id
	 * @param int|string $user_id 用户user id
	 * @param string $name 用户昵称
	 * @param string $cursos 分页位置
	 * @param int $count 获取条数
	 * @return array
	 */
	 function getFollowers($params)
	 {
		if (isset($params['id']) && $params['id']) {
			$url = sinaApiConfig::$url . 'statuses/followers/'.$params['id'].'.'.$this->format;
			unset($params['id']);
		} else {
			$url = sinaApiConfig::$url . 'statuses/followers.'.$this->format;
		}

		$response = $this->oAuthRequest($url, 'get', $params);

		return $response;
	 }

	/**
	 * 在@某人时，实时获取用户名建议。以可作关注人、粉丝搜索。
	 *
	 * @param string $q 搜索的关键字
	 * @param int $count 每页返回结果数。默认10 
	 * @param int $type 1代表粉丝，0代表关注人。另外， 粉丝最多返回1000个，关注人最多2000个 
	 * @param int $range 0代表只查关注人，1代表只搜索当前用户对关注人的备注，2表示都查. 默认为2.
	 *
	 * @return array
	 */
	function getSuggestionsAtUsers($params)
	{
		$url = sinaApiConfig::$url .'search/suggestions/at_users.'.$this->format;

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}	
	
	
	/**
	 * 转化成短连接
	 * @param string $longUrl, 不用url encode
	 */
	function shortUrl($longUrl)
	{
		$url 		= sinaApiConfig::$url .'short_url/shorten.'.$this->format;
		$response 	= $this->sourceRequest($url, 'get', array('url_long'=>$longUrl));
		return $response;
	}

	/**
	 * 返回与关键字相匹配的微博用户
	 *
	 */
	function searchUsers($params) 
	{
		$url = sinaApiConfig::$url .'users/search.'.$this->format;

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}

	
	/**
	 * 关注一个用户。关注成功则返回关注人的资料，目前的最多关注2000人。 
	 */
	function createFriendship($id=null, $user_id=null, $screen_name=null)
	{
		if ($id) {
			$url = sinaApiConfig::$url .'friendships/create/'.$id.'.'.$this->format;
		} else {
			$url = sinaApiConfig::$url .'friendships/create.'.$this->format;
		}

		$params = array();
		if ($user_id) {
			$params['user_id'] = $user_id;
		}
		if ($screen_name) {
			$params['screen_name'] = $screen_name;
		}
		$response = $this->oAuthRequest($url, 'post', $params);
		return $response;
	}
	
    /**
	 * 获取两个用户的关注关系 
	 *
	 */
	function friendshipsShow($target_id = '', $target_screen_name = '', $source_id = '', $source_screen_name = '')
	{
		$url = sinaApiConfig::$url .'friendships/show.'.$this->format;

		$params = array();
		if ($target_id) {
			$params['target_id'] = $target_id;
		}
		elseif ($target_screen_name) {
			$params['target_screen_name'] = $target_screen_name;
		}

        if ($source_id) {
			$params['source_id'] = $source_id;
		}
        elseif ($source_screen_name) {
			$params['source_screen_name'] = $source_screen_name;
		}

		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	 * 使用source方式访问api
	 *
	 * @param string $url
	 * @param string $method
	 * @param array $parameters
	 * @return array
	 */
	function sourceRequest($url, $method, $parameters) 
	{
		$parameters['source'] 	= sinaApiConfig::$APIKey;
		$method 				= strtoupper($method);
		switch ($method) 
		{
			case 'GET':
				if ( strpos($url,'?')===FALSE ) {
					$url = $url . '?' . http_build_query($parameters);
				}
				else {
					$url = $url . '&' . http_build_query($parameters);
				}
				$this->http->setUrl($url);
				$result  = $this->http->request();
				$code 	 = $this->http->getState();
				
				if ( 200!=$code) 
				{
					if ( 0==$code ) {
						return array('error_code'=>'1040002', 'error'=>'Access Timeout or Access denied');
					}
					
					// 错误日志
					$db 		= vApi::DB();
					$logParam 	= array('url'=>$url, 'post_data'=>json_encode($parameters), 'http_code'=>$code, 'result'=>$result, 'curl_error'=>$this->http->getError(), 'service_id'=>1, 's_ip'=>$_SERVER['SERVER_ADDR'], 'app_source'=>vApi::source(), 'uid'=>vApi::uid(), 'log_time'=>date('Y-m-d H:i:s'));
					$db->save($logParam, null, API_TB_3RD_API_LOG);
					unset($db);			
					return $this->throwException($result);
				}
				$result = json_decode(preg_replace('#(?<=[,\{\[])\s*("\w+"):(\d{6,})(?=\s*[,\]\}])#si', '${1}:"${2}"', $result) , TRUE);
				return $result;
		}
	}
	
	
	/**
	 * 发送一条私信
	 * @param int|string uid 用户uid
	 * @param string text 私信内容 需要做URLEncode，文本大小必须小于300个汉字
	 * @param string screen_name 用户昵称
	 * @param string fids 需要发送的附件ID。多个ID时以逗号分隔。上限为10个 
	 * @param string id 需要发送的微博ID
	 * @return array
	 */
	function sendDirectMessage( $params=array() ) 
	{
		// 优先传递uid
		if ( isset($params['uid']) && $params['uid'] && isset($params['screen_name']) ) {
			unset($params['screen_name']);
		} else if ( isset($params['screen_name']) && $params['screen_name'] && isset($params['uid']) ) {
			unset($params['uid']);
		}
		
		$url 		= sinaApiConfig::$IApiUrl . '2/direct_messages/new.' . $this->format;
		$response 	= $this->oAuthRequest($url, 'post', $params);
		return $response;
	}
	
	
	// 获取话题微博
	function trendStatuse($keyword)
	{
		$params['trend_name'] = $keyword;
		$this->setToken(sinaApiConfig::$appToken, sinaApiConfig::$appTkSecret);
		$url 	  = sinaApiConfig::$url . 'trends/statuses.' . $this->format;
		$response = $this->oAuthRequest($url, 'get', $params);
		return $response;
	}
	
	/**
	* 通过微博（评论、私信）MID获取其ID
	* 
	* @param string $mid
	* @param int $type
	* @param int $isBase62
	*/
	function statusesQueryid($mid, $type = 1, $isBase62 = 1)
	{
		$params = array('mid' => $mid, 'type' => $type, 'isBase62' => $isBase62);
		if (strpos($mid, ',') !== FALSE) {
			$params['is_batch'] = 1;
		}
		$url = sinaApiConfig::$newApiUrl . '2/statuses/queryid.' . $this->format;
		return $this->sourceRequest($url, 'get', $params);
	}
}